package com.cskaoyan.thread02.api;

/*
       public final void wait()  阻止自己
               1. 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前，导致当前线程等待
               2. 当前线程必须拥有此对象监视器
               3. 该线程发布对此监视器的所有权并等待


    1. 阻塞功能：
        当在某线程中，对象上.wait(), 在哪个线程中调用wait(), 导致哪个线程处于阻塞状态
        当某线程，因为调用执行某对象的wait(),而处于阻塞状态，我们说，该线程在该对象上阻塞。

    2. 唤醒条件
       当某线程，因为某对象A的wait(), 而处于阻塞状态时，如果要唤醒该线程，只能在其他线程中，
       再同一个对象(即对象A)上调用其notify()或notifyAll()

       A 线程  obj.wait()
       B 线程  obj.notify() 或者 obj.notifyAll()

       即在线程的阻塞对象上，调用notify或notifyAll方法，才能唤醒，在该对象上阻塞的线程

    3. 运行条件
          当前线程必须拥有此对象监视器。
          对象监视器：指synchronized代码块中的锁对象

        即我们只能在，当前线程所持有的synchronized代码块中的，锁对象上调用wait方法，才能正常执行

    4. 执行特征
          a.该线程发布(release)对此监视器的所有权
          b.等待(阻塞)

 */
public class Demo1Wait {

    public static void main(String[] args) throws InterruptedException {

        A a = new A();
        //a.wait(); //IllegalMonitorStateException

        synchronized (a) {
            // 当前线程在synchronized代码块中，持有了锁对象
            // 调用wait方法阻塞之前，当前线程，释放所持有的锁
            a.wait();
        }

        System.out.println("after wait");
    }
}

class A {}
